/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: MOS.h,v 1.1 2009/04/03 12:46:09 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __MOS__
#define __MOS__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <MObject.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented os interface.
	class API MOS
	{
	public:
		// constructor
		MOS();

		// destructor
		virtual ~MOS();

		// describe a class for the muse os
		INLINE VOID describe( const CHAR* name, MCFN cfn, const MDISP_MAP * disps = NULL );

		// describe a object for the muse os
		INLINE VOID describe( const CHAR* name, const MObject* obj );

		// describe a function for the muse os
		INLINE VOID describe( const CHAR* name, U32 func, U32 param );

		// create a new object from muse os
		INLINE MObject* create( const CHAR * class_name ) const;
		
		// query a object from the muse os
		INLINE MObject* query( const CHAR * object_name ) const;
		
		// call a function in the muse os 
		INLINE BOOL call( const CHAR* name, MVar* params, U32 count ) const;

		// execute a file to the muse os
		INLINE BOOL execute( const CHAR* name ) const;

		// load a plugin to the muse os
		INLINE BOOL loadPlugin( const CHAR* name );

		// free a plugin of the muse os
		INLINE VOID freePlugin( const CHAR* name );

		// send a message to the muse os
		INLINE VOID send();

	public:
		// query the instance of the muse os
		INLINE static MOS& CDECL instance();

	private:
		std::map< Str, MCFN >mCfns;
		std::map< Str, MObjectPtr >mObjects;
		std::map< Str, std::pair<U32,U32> >mFunctions;
		std::map< Str, HANDLE >mPlugins;
	};

	//////////////////////////////////////////////////////////////////////////

	#define MDECLARE_CLASS(class_name) \
		MOS::instance().describe(#class_name,class_name::creator,class_name::getThisDispatchMap());
	
	#define MDECLARE_OBJECT(object_name) \
		MOS::instance().describe(#object_name,object_name);
	
	#define MDECLARE_FUNCTION(func_name, param_name) \
		MOS::instance().describe(#func_name,(U32)func_name,(U32)param_name);

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __MOS__

//////////////////////////////////////////////////////////////////////////